/*!
    \file    dmx512_test.h
    \brief   DMX512灯带测试函数头文件

    \version 2025-01-20, V1.0.0, DMX512测试函数 for GD32C231C
*/

#ifndef DMX512_TEST_H
#define DMX512_TEST_H

#include "dmx512.h"
#include <stdint.h>
#include <stdbool.h>

/* 测试效果枚举 */
typedef enum {
    DMX512_EFFECT_SOLID_RED = 0,        /* 纯红色 */
    DMX512_EFFECT_SOLID_GREEN,          /* 纯绿色 */
    DMX512_EFFECT_SOLID_BLUE,           /* 纯蓝色 */
    DMX512_EFFECT_SOLID_WHITE,          /* 纯白色 */
    DMX512_EFFECT_RAINBOW,              /* 彩虹效果 */
    DMX512_EFFECT_BREATHING,            /* 呼吸灯效果 */
    DMX512_EFFECT_FLOWING,              /* 流水灯效果 */
    DMX512_EFFECT_GRADIENT,             /* 渐变效果 */
    DMX512_EFFECT_TWINKLE,              /* 闪烁效果 */
    DMX512_EFFECT_WAVE,                 /* 波浪效果 */
    DMX512_EFFECT_FIRE,                 /* 火焰效果 */
    DMX512_EFFECT_POLICE,               /* 警灯效果 */
    DMX512_EFFECT_COUNT                 /* 效果总数 */
} dmx512_effect_t;

/* 测试配置结构体 */
typedef struct {
    uint16_t led_count;                 /* LED数量 */
    uint32_t effect_duration_ms;        /* 每个效果持续时间(毫秒) */
    uint32_t update_interval_ms;        /* 更新间隔(毫秒) */
    bool auto_cycle;                    /* 自动循环效果 */
    dmx512_effect_t current_effect;     /* 当前效果 */
    uint32_t effect_step;               /* 效果步骤计数器 */
    uint32_t effect_timer;              /* 效果计时器 */
} dmx512_test_config_t;

/* 全局测试配置 */
extern dmx512_test_config_t g_dmx512_test;

/* DMX512测试函数声明 */

/*!
    \brief      初始化DMX512测试
    \param[in]  led_count: LED数量
    \param[in]  auto_cycle: 是否自动循环效果
    \param[out] none
    \retval     none
*/
void dmx512_test_init(uint16_t led_count, bool auto_cycle);

/*!
    \brief      运行DMX512测试
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_test_run(void);

/*!
    \brief      设置当前测试效果
    \param[in]  effect: 效果类型
    \param[out] none
    \retval     none
*/
void dmx512_test_set_effect(dmx512_effect_t effect);

/*!
    \brief      获取当前测试效果
    \param[in]  none
    \param[out] none
    \retval     当前效果类型
*/
dmx512_effect_t dmx512_test_get_effect(void);

/*!
    \brief      切换到下一个效果
    \param[in]  none
    \param[out] none
    \retval     none
*/
void dmx512_test_next_effect(void);

/*!
    \brief      获取效果名称
    \param[in]  effect: 效果类型
    \param[out] none
    \retval     效果名称字符串
*/
const char* dmx512_test_get_effect_name(dmx512_effect_t effect);

/* 具体效果实现函数 */

/*!
    \brief      纯色效果
    \param[in]  color: RGB颜色
    \param[in]  led_count: LED数量
    \param[out] none
    \retval     none
*/
void dmx512_test_solid_color_effect(rgb_color_t color, uint16_t led_count);

/*!
    \brief      彩虹效果
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_rainbow_effect(uint16_t led_count, uint32_t step);

/*!
    \brief      呼吸灯效果
    \param[in]  color: 基础颜色
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_breathing_effect(rgb_color_t color, uint16_t led_count, uint32_t step);

/*!
    \brief      流水灯效果
    \param[in]  color: 流水灯颜色
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_flowing_effect(rgb_color_t color, uint16_t led_count, uint32_t step);

/*!
    \brief      渐变效果
    \param[in]  start_color: 起始颜色
    \param[in]  end_color: 结束颜色
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_gradient_effect(rgb_color_t start_color, rgb_color_t end_color, uint16_t led_count, uint32_t step);

/*!
    \brief      闪烁效果
    \param[in]  color: 闪烁颜色
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_twinkle_effect(rgb_color_t color, uint16_t led_count, uint32_t step);

/*!
    \brief      波浪效果
    \param[in]  color: 波浪颜色
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_wave_effect(rgb_color_t color, uint16_t led_count, uint32_t step);

/*!
    \brief      火焰效果
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_fire_effect(uint16_t led_count, uint32_t step);

/*!
    \brief      警灯效果
    \param[in]  led_count: LED数量
    \param[in]  step: 动画步骤
    \param[out] none
    \retval     none
*/
void dmx512_test_police_effect(uint16_t led_count, uint32_t step);

/* 工具函数 */

/*!
    \brief      生成随机颜色
    \param[in]  none
    \param[out] none
    \retval     随机RGB颜色
*/
rgb_color_t dmx512_test_random_color(void);

/*!
    \brief      颜色混合
    \param[in]  color1: 颜色1
    \param[in]  color2: 颜色2
    \param[in]  ratio: 混合比例 (0-255)
    \param[out] none
    \retval     混合后的颜色
*/
rgb_color_t dmx512_test_blend_colors(rgb_color_t color1, rgb_color_t color2, uint8_t ratio);

/*!
    \brief      正弦波计算
    \param[in]  angle: 角度 (0-359)
    \param[out] none
    \retval     正弦值 (0-255)
*/
uint8_t dmx512_test_sin(uint16_t angle);

/*!
    \brief      余弦波计算
    \param[in]  angle: 角度 (0-359)
    \param[out] none
    \retval     余弦值 (0-255)
*/
uint8_t dmx512_test_cos(uint16_t angle);

#endif /* DMX512_TEST_H */